package ctxdata

import (
	"context"
	"github.com/golang-jwt/jwt/v4"
)

// 定义一个私有类型作为 context.Context 的 key，避免冲突
type contextKey struct{}

// AuthClaims 是存储在 context 中的认证信息结构
type AuthClaims struct {
	UserID   int64  // 用户ID
	UserName string // 用户名
	Role     string // 角色，例如 "admin", "user"
	Token    string
	jwt.RegisteredClaims
	// 其他你希望传递的 JWT claims 或认证相关信息
}

// SetAuthClaims 将 AuthClaims 存储到 context 中
func SetAuthClaims(ctx context.Context, claims *AuthClaims) context.Context {
	return context.WithValue(ctx, contextKey{}, claims)
}

// GetAuthClaims 从 context 中获取 AuthClaims
func GetAuthClaims(ctx context.Context) (*AuthClaims, bool) {
	claims, ok := ctx.Value(contextKey{}).(*AuthClaims)
	return claims, ok
}

// GetUserID 从 context 中获取用户ID
func GetUserID(ctx context.Context) int64 {
	claims, ok := GetAuthClaims(ctx)
	if !ok || claims == nil {
		return 0 // 或者返回一个错误，取决于你的业务逻辑
	}
	return claims.UserID
}
